package com.cinema.dao;

import com.cinema.model.User;
import com.cinema.model.UserType;

import java.util.List;

/**
 * 用户数据访问接口
 * 定义用户CRUD操作的标准方法
 */
public interface UserDao {
    
    /**
     * 保存用户
     * @param user 用户对象
     * @return 是否保存成功
     */
    boolean save(User user);
    
    /**
     * 根据用户ID查找用户
     * @param userId 用户ID
     * @return 用户对象，未找到返回null
     */
    User findById(String userId);
    
    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户对象，未找到返回null
     */
    User findByUsername(String username);
    
    /**
     * 根据手机号查找用户
     * @param phoneNumber 手机号
     * @return 用户对象，未找到返回null
     */
    User findByPhoneNumber(String phoneNumber);
    
    /**
     * 更新用户信息
     * @param user 用户对象
     * @return 是否更新成功
     */
    boolean update(User user);
    
    /**
     * 删除用户
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean delete(String userId);
    
    /**
     * 查找所有用户
     * @return 用户列表
     */
    List<User> findAll();
    
    /**
     * 根据用户类型查找用户
     * @param userType 用户类型
     * @return 用户列表
     */
    List<User> findByUserType(UserType userType);
    
    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);
    
    /**
     * 检查用户ID是否存在
     * @param userId 用户ID
     * @return 是否存在
     */
    boolean existsById(String userId);
    
    /**
     * 检查手机号是否存在
     * @param phoneNumber 手机号
     * @return 是否存在
     */
    boolean existsByPhoneNumber(String phoneNumber);
    
    /**
     * 验证用户登录
     * @param username 用户名
     * @param password 密码
     * @return 用户对象，验证失败返回null
     */
    User validateLogin(String username, String password);
    
    /**
     * 修改用户密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    boolean changePassword(String userId, String newPassword);
    
    /**
     * 重置用户密码为默认密码
     * @param userId 用户ID
     * @return 是否重置成功
     */
    boolean resetPassword(String userId);
    
    /**
     * 获取用户数量
     * @return 用户总数
     */
    int getUserCount();
    
    /**
     * 根据用户类型获取用户数量
     * @param userType 用户类型
     * @return 该类型用户数量
     */
    int getUserCountByType(UserType userType);
}